package com.sandu.lib_mvvm.ext

import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.sandu.lib_mvvm.base.BaseApp
import com.sandu.lib_mvvm.base.viewmodel.BaseViewModel
import java.lang.reflect.ParameterizedType


/**
 * 获取当前类绑定的泛型ViewModel-clazz
 */
//@Suppress("UNCHECKED_CAST")
//fun <VM> getVmClazz(obj: Any): VM {
//    return (obj.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as VM
//}
//java class
//fun <VM> getVmClazz(obj: Any): Class<VM> {
//    val superclass = obj.javaClass.genericSuperclass
//    if (superclass is ParameterizedType) {
//        val actualTypeArguments = superclass.actualTypeArguments
//        if (actualTypeArguments.isNotEmpty()) {
//            val typeArgument = actualTypeArguments[0]
//            if (typeArgument is Class<*>) {
//                @Suppress("UNCHECKED_CAST")
//                return typeArgument as Class<VM>
//            }
//        }
//    }
//    throw IllegalArgumentException("无法获取指定的ViewModel类型的Class对象，对象的泛型参数不符合预期。")
//}
//kotlin class
fun <VM : Any> getVmClazz(obj: Any): Class<VM> {
    val superclass = obj.javaClass.genericSuperclass
    if (superclass is ParameterizedType) {
        val actualTypeArguments = superclass.actualTypeArguments
        if (actualTypeArguments.isNotEmpty()) {
            val typeArgument = actualTypeArguments[0]
            if (typeArgument is Class<*>) {
                @Suppress("UNCHECKED_CAST")
                return typeArgument as Class<VM>
            } else if (typeArgument is kotlin.reflect.KClass<*>) {
                // 将KClass转换为对应的Java Class对象
                return typeArgument.javaObjectType as Class<VM>
            }
        }
    }
//    if ("class com.sandu.lib_common.webview.BaseWebActivity".equals(superclass.toString())) {
//        val superclass = obj.javaClass.genericSuperclass.javaClass.genericSuperclass
//        if (superclass is ParameterizedType) {
//            val actualTypeArguments = superclass.actualTypeArguments
//            if (actualTypeArguments.isNotEmpty()) {
//                val typeArgument = actualTypeArguments[0]
//                if (typeArgument is Class<*>) {
//                    @Suppress("UNCHECKED_CAST")
//                    return typeArgument as Class<VM>
//                } else if (typeArgument is kotlin.reflect.KClass<*>) {
//                    // 将KClass转换为对应的Java Class对象
//                    return typeArgument.javaObjectType as Class<VM>
//                }
//            }
//        }
//    }
    throw IllegalArgumentException("无法获取指定的ViewModel类型的Class对象，对象的泛型参数不符合预期。")
}

/**
 * 在Activity中得到Application上下文的ViewModel
 */
inline fun <reified VM : BaseViewModel> AppCompatActivity.getAppViewModel(): VM {
    (this.application as? BaseApp).let {
        if (it == null) {
            throw NullPointerException("你的Application没有继承框架自带的BaseApp类，暂时无法使用getAppViewModel该方法")
        } else {
            return it.getAppViewModelProvider().get(VM::class.java)
        }
    }
}

/**
 * 在Fragment中得到Application上下文的ViewModel
 * 提示，在fragment中调用该方法时，请在该Fragment onCreate以后调用或者请用by lazy方式懒加载初始化调用，不然会提示requireActivity没有导致错误
 */
inline fun <reified VM : BaseViewModel> Fragment.getAppViewModel(): VM {
    (this.requireActivity().application as? BaseApp).let {
        if (it == null) {
            throw NullPointerException("你的Application没有继承框架自带的BaseApp类，暂时无法使用getAppViewModel该方法")
        } else {
            return it.getAppViewModelProvider().get(VM::class.java)
        }
    }
}

/**
 * 得到当前Activity上下文的ViewModel
 */
@Deprecated("已过时的方法，现在可以直接使用Ktx函数 viewmodels()获取")
inline fun <reified VM : BaseViewModel> AppCompatActivity.getViewModel(): VM {
    return ViewModelProvider(
        this,
        ViewModelProvider.AndroidViewModelFactory(application)
    ).get(VM::class.java)
}

/**
 * 得到当前Fragment上下文的ViewModel
 * 提示，在fragment中调用该方法时，请在该Fragment onCreate以后调用或者请用by lazy方式懒加载初始化调用，不然会提示requireActivity没有导致错误
 */
@Deprecated("已过时的方法，现在可以直接使用Ktx函数 viewmodels()获取")
inline fun <reified VM : BaseViewModel> Fragment.getViewModel(): VM {
    return ViewModelProvider(
        this,
        ViewModelProvider.AndroidViewModelFactory(this.requireActivity().application)
    ).get(VM::class.java)
}

/**
 * 在Fragment中得到父类Activity的共享ViewModel
 * 提示，在fragment中调用该方法时，请在该Fragment onCreate以后调用或者请用by lazy方式懒加载初始化调用，不然会提示requireActivity没有导致错误
 */
@Deprecated("已过时的方法，现在可以直接使用Ktx函数 activityViewModels()获取")
inline fun <reified VM : BaseViewModel> Fragment.getActivityViewModel(): VM {
    return ViewModelProvider(
        requireActivity(),
        ViewModelProvider.AndroidViewModelFactory(this.requireActivity().application)
    ).get(VM::class.java)
}






